#pragma once

#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>

#include "../comm/util.hpp"
#include "../comm/log.hpp"

namespace ns_compile
{
  using namespace ns_util;
  using namespace ns_log;
  class Compile
  {
  public:
    // 需要对这个文件名添加后缀
    // 让子进程进行编译
    static bool compile(const std::string &filename)
    {
      pid_t pid = fork();
      if (pid < 0)
      {
        LOG(ERROR) << "创建子进程失败" << std::endl;
        return false;
      }
      else if (pid == 0)
      {
        umask(0);
        // 编译源文件出错，把错误信息写入错误文件中，需要进行重定向
        int fd = open(PathUtil::compileError(filename).c_str(), O_CREAT | O_WRONLY, 0644);
        if (fd < 0)
        {
          // 打开、创建保存错误信息的文件失败
          LOG(FALSE) << "打开、创建保存错误信息的文件失败" << std::endl;

          exit(2);
        }
        // 重定向
        dup2(fd, 2);

        execlp("g++", "g++","-D" ,"COMPILER_ONLINE", "-std=c++11","-o",PathUtil::exe(filename).c_str(), PathUtil::src(filename).c_str(), nullptr);
        LOG(ERROR) << "启动g++错误" << std::endl;
        exit(3);
      }
      else
      {
        waitpid(pid, nullptr, 0);
        if (FileUtil::isFileExist(PathUtil::exe(filename)))
        {
          LOG(INFO) << PathUtil::exe(filename) << "编译成功" << std::endl;
          return true;
        }
      }
      LOG(ERROR) << "编译失败，没有形成可执行程序" << std::endl;
      return false;
    }
  };

}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    